package org.dromara.tearoom.domain.bo;

import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.tearoom.domain.TerIotDevice;

import java.util.Date;

/**
 * IoT设备业务对象 ter_iot_device
 *
 * @author LionLi
 * @date 2025-04-08
 */
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = TerIotDevice.class, reverseConvertGenerate = false)
public class TerIotDeviceBo extends BaseEntity {

    /**
     * 设备 ID，主键，自增
     */
    @NotNull(message = "设备 ID，主键，自增不能为空", groups = { EditGroup.class })
    private Long id;

    /**
     * 设备唯一标识符，全局唯一，用于识别设备
     */
    @NotBlank(message = "设备编号，全局唯一，用于识别设备不能为空", groups = { AddGroup.class, EditGroup.class })
    private String deviceKey;

    /**
     * 设备名称，在产品内唯一，用于标识设备
     */
    @NotBlank(message = "设备名称，在产品内唯一，用于标识设备不能为空", groups = { AddGroup.class, EditGroup.class })
    private String deviceName;

    /**
     * 设备备注名称，供用户自定义备注
     */
    private String nickname;

    /**
     * 设备序列号
     */
    private String serialNumber;

    /**
     * 设备图片
     */
    private String picUrl;

    /**
     * 设备分组编号集合
     */
    private String groupIds;

    /**
     * 房间 ID
     */
    @NotNull(message = "房间 ID不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long roomId;

    /**
     * 产品 Key
     */
    private String productKey;

    /**
     * 设备类型，参见 IotDeviceTypeEnum 枚举
     */
    @NotNull(message = "设备类型，参见 IotDeviceTypeEnum 枚举不能为空", groups = { AddGroup.class, EditGroup.class })
    private Long deviceType;

    /**
     * 设备种类，参见 IotDeviceClassEnum 枚举
     */
    @NotNull(message = "设备种类，参见 IotDeviceClassEnum 枚举不能为空", groups = { AddGroup.class, EditGroup.class })
    private Integer deviceClass;



    /**
     * 网关设备 ID，子设备需要关联的网关设备 ID
     */
    private Long gatewayId;

    /**
     * 设备状态，参见 IotDeviceStateEnum 枚举
     */
    private Integer state;

    /**
     * 设备合闸状态
     */
    private Integer keyStatus;

    /**
     * 配网锁，0：关闭，1：开启
     */
    private Integer wifiLock;

    /**
     * 锁扣。
     * 0：可手动控制分合闸，异常分闸恢复正常后不会自动合闸；
     * 1：可手动分合闸，异常分闸恢复正常后自动合闸；
     * 2：不可手动控制分合闸，异常情况分闸恢复正常后自动合闸。
     * 异常分闸指：欠压、过压重新上电等异常情况出现的跳闸。
     */
    private Integer keyLock;

    /**
     * 最后上线时间
     */
    private Date onlineTime;

    /**
     * 最后离线时间
     */
    private Date offlineTime;

    /**
     * 设备激活时间
     */
    private Date activeTime;

    /**
     * 设备的 IP 地址
     */
    private String ip;

    /**
     * 设备的 WIFI名称
     */
    private String ssid;

    /**
     * 设备的固件编号
     */
    private String firmwareId;

    /**
     * 设备密钥，用于设备认证，需安全存储
     */
    private String deviceSecret;

    /**
     * MQTT 客户端 ID
     */
    private String mqttClientId;

    /**
     * MQTT 用户名
     */
    private String mqttUsername;

    /**
     * MQTT 密码
     */
    private String mqttPassword;
    /**
     * 订阅主题
     */
    @NotBlank(message = "订阅主题不能为空", groups = { AddGroup.class, EditGroup.class })
    private String mqttSubscribe;
    /**
     * 发布主题
     */
    @NotBlank(message = "发布主题不能为空", groups = { AddGroup.class, EditGroup.class })
    private String mqttPublish;

    /**
     * 认证类型（如一机一密、动态注册）
     */
    private String authType;

    /**
     * 设备位置的纬度
     */
    private Long latitude;

    /**
     * 设备位置的经度
     */
    private Long longitude;

    /**
     * 地区编码
     */
    private Long areaId;

    /**
     * 设备详细地址
     */
    private String address;

    /**
     * 设备配置，JSON 格式
     */
    private String config;

    /**
     * 备注
     */
    private String remark;


}
